查看原文
其他

教你用 Python 做一个物体检测系统

FAIZANSHAIKH Python开发者 2019-11-07

(给Python开发者加星标,提升Python技能


翻译:数据派THU / 闫晓雨,英文:analyticsvidhya



引言


当有一幅图像展示在面前时,我们的大脑会立即识别出其中包含的物体。而另一方面,机器却需要花费大量时间并训练数据以识别这些物体。但随着最近硬件和深度学习的升级,计算机视觉领域变得更加容易和直观。


请查看下面示例图片,该系统能够以令人难以置信的准确度识别图像中的不同物体:



物体检测技术已经在各行各业中得到了迅速应用,这有助于为自动驾驶汽车在交通中保驾护航,在拥挤的地方识别出暴力行为,协助体育团队分析和建立球探报告,确保制造业中的各项环节得到适当的质量控制,以及其他许多事务。而这些还只是物体探测技术表面上可以做到的事情!


在本文中,我们将了解物体检测技术是什么以及可以用来解决此领域问题的几种不同方法,接着深入研究在Python中如何构建我们自己的对象检测系统。在本文结束时,您将拥有足够的知识来独自迎接不同的物体检测挑战!


注意:本教程预设您了解深度学习的基础知识,并且在此之前已经解决了简单的图像处理问题。如果您还没有,或需要复习,我建议您先阅读以下文章:


  • 深度学习的基础 - 从人工神经网络开始

    https://www.analyticsvidhya.com/blog/2016/03/introduction-deep-learning-fundamentals-neural-networks/

  • 计算机视觉的深度学习 - 卷积神经网络简介

    https://www.analyticsvidhya.com/blog/2016/04/deep-learning-computer-vision-introduction-convolution-neural-networks/

  • 教程:使用Keras优化神经网络(带图像识别案例研究)

    https://www.analyticsvidhya.com/blog/2016/10/tutorial-optimizing-neural-networks-using-keras-with-image-recognition-case-study/

 

目录


  • 什么是物体检测?

  • 我们可以使用不同的方法来解决物体检测问题

    • 方法1:原始的方式(分而治之)

    • 方法2:增加分割数量

    • 方法3:执行结构化划分

    • 方法4:提高效率

    • 方法5:使用深度学习进行特征选择以构建端到端方法

  • 获取技术:如何使用ImageAI库构建物体检测模型

 

什么是物体检测?


在构建最先进的模型之前,让我们先尝试了解物体检测是什么。假使我们需要建立一个自动驾驶汽车的行人检测系统,汽车捕获的图像如下图所示。你会如何描述这张图片?

 


图像显示汽车在一个广场附近,有几个人正在我们的车前过马路。由于无法准确识别交通标志,汽车的行人检测系统应准确识别出人们行走的位置,以避开他们。


那么汽车系统如何确保完美避开呢?它可以做的是围绕这些人创建一个边界框,以便系统根据人们在图像中的位置,决定采取哪条路径,避免任何意外。


 

物体检测的目标有两个方面:


  • 识别图像中存在的所有对象及其位置

  • 过滤掉关注对象

 

解决物体检测问题的不同方法


现在我们知道问题是什么了,那么可以采用哪种方法(或多种方法)来解决它呢?在本节中,我们将介绍一些可用于检测图像物体的技术。先从最简单的方法开始,从那里找到我们的方式。如果您对下面提及的方法有任何建议或者有相应的替代方法,请在评论部分告诉我们!


方法1:原始的方式(分而治之)


最简单方法是将图像分为四个部分:


  • 左上角

 

 

  • 右上角

 


  • 左下角



  • 右下角 


 

现在,下一步就是把每一部分图像都交给图像分类器进行识别。这样,我们会得到每一部分图像中是否有行人的输出结果。如果有,便在原图像中标记该区域。输出结果类似这样:


 

这是开始尝试的一个很好的方法,但我们在寻求更加精确和准确的系统。它需要识别整个物体(或者是在本例中的人),因为仅仅识别物体的某些部分可能会导致灾难性的后果。

 

方法2:增加分割数量

 

先前的系统效果不错,但是我们还能如何改进呢?我们可以通过指数地增加我们输入系统的选框的数量来提高精确度。输出结果应该是这样:


 

这个方法有利有弊。尽管我们的解决方案看起来比原始的方法好一点点,但是它粗筛出很多的选框,实际结果基本一样。这是一个问题,我们需要一个更有条理的方法来解决这个问题问题。

 

方法3:展示结构严密的分区

 

为了用一种更有条理的方法构建我们的物体检测系统,我们可以按以下步骤操作:

 

步骤1:把图像划分成10x10的格子,如图所示:



步骤2:定义每个区域的质心。

 

步骤3:对于每一个质心,选取3个高度和纵横比不同的区域如下:

 


步骤4:将所有这些创建的区域传入图像分类器来获得预测结果。


所以最终输出结果是什么样呢?一个更加确定且严密有序的结果——见下图:



但我们还可以进一步改进!继续阅读以了解另一种能产生更好结果的方法。

 

方法4:提高效率

 

先前我们看到的方法在很大程度上是可以接受的,但我们还可以构建一个比之前更加高效的系统。你能建议怎么做吗?在我脑海中,我能提出一个优化方案。如果我们思考一下方法3,可以做两件事来让模型更好:

 

  • 增加网格的大小:将网格大小增加到20,替代原有的10:

 


  • 以多种高度和纵横比选取更多区域而不仅是3个区域:在这里,我们可以围绕每一个锚定质心选取9种形状的区域,即3个不同高度的正方形区域和6个不同高度的垂直和水平的矩形区域,这会给我们提供不同纵横比的区域。


 

再次说明,这也是有利也有弊。尽管这些方法都能帮助我们达到一个更细致的水平,但是由于我们不得不把所有区域传入到图像分类模型中,这会再次造成计算爆炸。

 

我们能够做的是,有选择性地选取区域而不是全都选取。举个例子,我们能够构建一个中间分类模型,它尝试预测选区是否真的只有背景,还是潜在地包含一个物体,这会指数式地减少图像分类模型所需要判断的区域。

 

还有另一种优化方案,就是减少“同一物体”的预测。让我们再次回顾方法3:


 

就像你看到的一样,基本上所有的选框预测的都是同一个人,我们可以选择其中任意一个。因此,我们可以考虑从标记“同一物体”的所有选框中,任选一个最有可能检测出一个人的选框输入图像分类模型中,进行预测。

 

目前,所有这些优化方案都给了我们相当合适的预测结果。我们几乎稳操胜券,但你猜出缺了什么吗?深度学习!

 

方法5:使用深度学习进行特征选择以构建端到端方法


深度学习在物体检测领域有很大的潜力。你能否建议我们从哪里以及如何使用深度学习解决我们的问题吗?我已经列出一些方法,如下:


  • 可以通过神经网络输入原始图像来减少维度,而不是输入原始图像的所有区域。

  • 还可以使用神经网络来限定图像区域的选择

  • 可以强化深度学习算法,使预测尽可能地接近图像中物体的原始边界框,这将确保算法能够更严格地、更精细地预测边界框。


现在我们可以采用单个深度神经网络模型,来尝试独自解决所有问题,而不是训练不同的神经网络来解决每一个问题。这样做的好处是,神经网络中每个较小的组件都将有助于优化该神经网络的其他部分,从而便于我们合作,共同训练整个深层模型。

 

目前为止,在我们看过的所有方法中,我们的输出结果能够提供最佳性能,有点类似于下图。我们将在下一节中看到如何使用Python创建它。


 

获取技术:如何使用ImageAI库

构建物体检测模型


现在我们知道了什么是物体检测以及解决此问题的最佳方法,让我们构建自己的对象检测系统!我们即将使用的是ImageAI库,这是一个python库,支持计算机视觉任务中所有最先进的机器学习算法。

 

运行物体检测模型获得预测是非常简单的。我们不必从复杂的安装脚本来开始,甚至也不需要GPU来生成预测!我们将使用这个ImageAI库来获得在方法5中所看到的输出结果。强烈建议您在自己的机器上输入下面的代码,因为这可以帮助您能够从本节中获得最大的知识。

 

请注意,您需要在创建物体检测模型之前设置系统。在本地系统中安装Anaconda后,即可开始执行以下步骤。

 

步骤1:使用python 3.6版搭建Anaconda环境。


conda create -nretinanet python=3.6 anaconda


步骤2:激活环境并安装必要的软件包。


source activateretinanet

conda installtensorflow numpy scipy opencv pillow matplotlib h5py keras


步骤3:安装ImageAI库


pip install https://github.com/OlafenwaMoses /ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl


步骤4:下载获得预测所需的预训练模型。该模型基于RetinaNet(未来文章的主题)。访问链接下载——RetinaNet预训练模型:


https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5


步骤5:将下载的文件复制到当前工作文件夹。


步骤6:从以下链接下载图像,将图像命名为image.png:


https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2018/06/I1_2009_09_08_drive_0012_001351-768x223.png


步骤7:打开jupyter笔记本(在终端中键入jupyter notebook)并运行以下代码:


from imageai.Detection import ObjectDetection

import os

 

execution_path = os.getcwd()

 

detector = ObjectDetection()

detector.setModelTypeAsRetinaNet()

detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))

detector.loadModel()

custom_objects = detector.CustomObjects(person=True, car=False)

detections = detector.detectCustomObjectsFromImage(input_image=os.path.join(execution_path , "image.png"), output_image_path=os.path.join(execution_path , "image_new.png"), custom_objects=custom_objects, minimum_percentage_probability=65)

 

for eachObject in detections:

   print(eachObject["name"] + " : " + eachObject["percentage_probability"] )

   print("--------------------------------")



这将创建一个名为image_new.png的修改后的图像文件,其中包含物体的边界框。


步骤8:如需要打印图像,请使用以下代码:


from IPython.display import Image

Image("image_new.png")



恭喜!您已为行人检测创建了自己的物体检测模型。这太棒啦!

 

结语


在本文中,我们了解了什么是物体检测以及创建物体检测模型的思路,还学习了如何使用ImageAI库构建行行人检测模型。


通过微调代码,您可以轻松地转换模型以解决自己的物体检测挑战。如果您已经使用过上述方法解决了这样的问题,特别是社会方面的,请在下面的评论中告诉我们! 


原文标题:

Understandingand Building an Object Detection Model from Scratch in Python

原文链接:

https://www.analyticsvidhya.com/blog/2018/06/understanding-building-object-detection-model-python/



推荐阅读

(点击标题可跳转阅读)

为什么 Python 这么慢?

开源社区行为准则风波不断,SQLite 遭批评

wxPython:python 首选的 GUI 库


觉得本文对你有帮助?请分享给更多人

关注「Python开发者」加星标,提升Python技能

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存